package cn.jbolt.ai.core.chain;

import cn.jbolt.ai.app.entity.AiAppNode;
import cn.jbolt.ai.app.service.AiAppNodeService;
import cn.jbolt.util.Result;
import cn.jbolt.util.SpringContextUtil;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

/**
 * app 事件链中心
 */
@Component
public class ChainCenter {

    /**
     * 正式运行的事件链
     */
    private static final ConcurrentHashMap<Long, AiAppChain> APP_CHAIN_HOLDER = new ConcurrentHashMap<>();
    /**
     * 试运行模式的事件链
     */
    private static final ConcurrentHashMap<Long, AiAppChain> DEV_APP_CHAIN_HOLDER = new ConcurrentHashMap<>();


    /**
     * 注册app事件链
     * @param appId
     * @param nodes
     */
    public static void registerAppChain(Long appId, List<AiAppNode> nodes) {
        APP_CHAIN_HOLDER.put(appId, new AiAppChain(nodes));
    }
    /**
     * 注册app事件链
     * @param appId
     * @param nodes
     */
    public static void registerDevAppChain(Long appId, List<AiAppNode> nodes) {
        AiAppChain chain = new AiAppChain(nodes);
        chain.setDebug(true);
        DEV_APP_CHAIN_HOLDER.put(appId, chain);
    }

    /**
     * 根据appid获取它的试运行事件链
     * @param appId
     * @return
     */
    public static AiAppChain getDevAppChain(Long appId) {
        return DEV_APP_CHAIN_HOLDER.get(appId);
    }


    /**
     * 根据appid获取它的事件链，没有就初始化
     * @param appId
     * @return
     */
    public static AiAppChain getAppChain(Long appId) {
        if (APP_CHAIN_HOLDER.containsKey(appId)) {
            return APP_CHAIN_HOLDER.get(appId);
        }
        AiAppNodeService nodesService = SpringContextUtil.getBean(AiAppNodeService.class);
        Result<List<AiAppNode>> res = nodesService.getNodesByAppId(appId);
        AiAppChain chain = new AiAppChain(res.getData());
        AiAppChain aiAppChain = APP_CHAIN_HOLDER.putIfAbsent(appId, chain);
        if (aiAppChain != null) {
            return aiAppChain;
        }
        return chain;
    }

    /**
     * 移除事件链
     * @param appId
     */
    public static void remove(Long appId) {
        APP_CHAIN_HOLDER.remove(appId);
    }
    /**
     * 移除事件链
     * @param appId
     */
    public static void removeDev(Long appId) {
        DEV_APP_CHAIN_HOLDER.remove(appId);
    }

}
